Many current computers and computing devices utilize multicore technology. In order to obtain the maximum benefit of the multicore technology, newer software programs are implemented as parallel programs capable of being executed using multi-threading. However, with the increased parallelism of such programs, the non-determinism associated with the programs likewise increases. Non-determinism of software programs complicates the development cycle. In particular, some parallel programs may suffer from concurrency errors, typically known as “concurrency bugs” during execution.
Concurrency errors further complicate the development of parallel programs because such errors are difficult to reproduce. The parallelism of multi-threaded programs can result in concurrency bugs that only materialize under very specific conditions. For example, in some cases, the concurrency bug may not occur even with identical input. The inability to reproduce consistently the concurrency bug substantially increases the difficulty of debugging the software program. Additionally, even in the rare cases in which such concurrency bugs can be occasionally reproduced, the non-determinism of the concurrency errors makes those errors resistant to typical cyclic debugging techniques, which can be effective in debugging non-parallel programs.